package com.thoughtworks.bytecode2class.instruction;

import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class LOOKUPSWITCH extends Instruction {

    private int defaultOffset;
    private int nPairs;
    private Map<Integer, Integer> matchOffsetPairs = new TreeMap<Integer, Integer>();
    private int padding;


    LOOKUPSWITCH(List<Byte> bytes, int offset) {
        super(OpCode.LOOKUPSWITCH, bytes, offset);
        padding = 3 - offset % 4;
        parseDefaultOffset();
        parseNPairs();
        parseMatchOffsetPairs(bytes);
    }

    private byte i(int index) {
        return bytes.get(offset + padding + index);
    }

    private void parseMatchOffsetPairs(List<Byte> bytes) {
        for (int i = 0; i < nPairs; i++) {
            int match = n(i(9 + 8 * i), i(10 + 8 * i), i(11 + 8 * i), i(12 + 8 * i));
            int _offset = n(i(13 + 8 * i), i(14 + 8 * i), i(15 + 8 * i), i(16 + 8 * i));
            matchOffsetPairs.put(match, _offset);
        }
    }

    private void parseNPairs() {
        nPairs = n(i(5), i(6), i(7), i(8));
    }

    private void parseDefaultOffset() {
        defaultOffset = n(i(1), i(2), i(3), i(4));
    }

    private int n(byte b1, byte b2, byte b3, byte b4) {
        return (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
    }

    @Override
    public int getParamCount() {
        return padding + 8 + nPairs * 8;
    }
}
